aliases:
- Portfolioland
- '"Portfolioland"'
Das Designsystem von Portfolioland ist teilweise nach dem Prinzip des Atomaren Designs strukturiert. Es umfasst Aspekte wie Farben, Typografie, Buttons, Formulare und Funktionen, die in diesem Dokument detailliert beschrieben sind.
aliases:
- Nutzerführung
Das Erstellen von Portfolios im künstlerischen Kontext benötigt möglichst große Freiheiten in der Gestaltung der Inhalte.
In Portfolioland werden der Nutzer:in diese Freiheiten in der Gestaltung durch ein Drag and Drop System gegeben.
Im Profil kann die Nutzer:in
Im Designsystem spielen Farben eine entscheidende Rolle, da sie verschiedene Aufgaben erfüllen. Die Hauptfarbe, die durch den Hex-Code #A32EFF repräsentiert wird, dient als öffentliche Farbe und wird vor allem für die Repräsentation des "öffentlichen Status" in Elemente verwendet. Die sekundäre Farbe, definiert als #FFA92C, fungiert als private Farbe und findet bei Elementen Einsatz, die den Status "Privat" repräsentieren .
Die elementare Funktion der Farbgebung besteht darin, die Zustände der Seite zu unterscheiden. Hier kommt die tertiäre Farbe ins Spiel, die durch den Code #BFFDF dargestellt wird und als Akzentfarbe fungiert. Sie zeigt dem Benutzer an, welche Elemente momentan im Focus sind.
Die neutrale Farbe, codiert als #0C0C20, wird hingegen hauptsächlich für den Text verwendet, um eine gute Lesbarkeit zu gewährleisten.
Für Fehlermeldungen steht die Farbe mit dem Code #E31C3D bereit, um diese deutlich hervorzuheben. Insgesamt tragen diese Farbcodes maßgeblich zur visuellen Kohärenz und Benutzerfreundlichkeit des Designs bei.
Der folgende Codeblock präsentiert die Vorlagen in der app.css-Datei für die verschiedenen Farben. Diese können dann im Code mithilfe von var(--example) verwendet werden. Beachten Sie jedoch, dass die app.css-Datei über einen Style-Link eingebunden sein muss.
// app.css
:root{
--accent-color-dark: rgba(75, 223, 255, 0.4);
//Background-Colors:
--bg-bright: rgb(241, 240, 240);
--bg-dark: rgb(0 0 0);
--bg-light: rgb(241, 240, 240);
--grey: #ccc;
//Text-Colors
--text-light: #0c0c20;
--text-light-100: #0c0c20b1;
--white: #FFF;
--primary: #A32EFF;
--secondary: #FFA92C;
--tertiary: #4bffdf;
}
tags:
- design
- system
- designsystem
- button
Buttons sind unverzichtbare Bestandteile des User Interfaces, da sie dem Benutzer klare Interaktionsmöglichkeiten bieten. Anders als Inputfelder, die Daten sammeln, initiieren Buttons unmittelbare Aktionen. Durch ihre visuelle Gestaltung und Beschriftung kommunizieren sie dem Nutzer, welche Funktion sie auslösen. Dadurch ermöglichen sie eine intuitive Navigation und Interaktion innerhalb einer Anwendung oder Webseite. Ob zum Bestätigen einer Auswahl, zum Absenden eines Formulars oder zum Starten einer bestimmten Funktion – Buttons sind das Bindeglied zwischen dem Benutzer und der gewünschten Aktion, und somit ein essenzieller Bestandteil jeder Benutzeroberfläche.
<button>Button Lable</button>
<style>
button {
display: flex;
justify-content: center;
align-self: center;
flex-direction: row;
align-items: center;
gap: 0.25rem;
color: var(--text-light);
cursor: pointer;
padding: 0.3rem;
border: 0.1rem solid var(--text-light)
border-radius: 20rem;
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 1000ms;
&:hover {
outline: 0.2rem solid var(--tertiary);
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 1000ms;
}
&:focus {
outline: 0.1rem solid var(--tertiary);
}
}
</style>
"Toggle Switch" ist noch nicht erstellt. Klicken zum Erstellen.
tags:
- JS
- svelte
- sveltekit
Svelte-Grid ist eine Library für Sveltekit die es ermöglicht Kästen per Drag und Drop in einem Koordinatensystem auf de Website zu verschieben und zu skalieren.
Das Login für Portfolioland ist über Email und Passwort möglich. Der visuellen Ästhetik folgend haben die Eingabeformularelemente abgerundete Kanten und nutzen die vorgegebenen Komponenten aus Buttons und Forms. Sollte etwas bei der Eingabe/Absenden nicht korrekt sein, wird dem Benutzer dies durch ein Element aufgezeigt, das ein- und ausfadet.
Dieses Element ist in den Farben für den Fehlerzustand gehalten und beinhaltet zusätzlich Informationen über den potenziellen Fehler.
TODO: SAML- Integration.
Das Tool soll nach Möglichkeit einen möglichst barrierearmen Einwahlprozess bieten. Hierzu soll eine Integration der SAML/Shibboleth Authentifizierung der Universität Kassel angestrebt werden.
Hier ist ein Beispielcode, der die Implementierung des Designs im Framework 0002_Tools/Tools/JS/Sveltekit zeigt, wobei besonders die Verwendung der {#if}-Schleifen zur Darstellung der rückläufigen Formwerte zu beachten ist:
<script>
import LoginButton from '$lib/components/Buttons/loginButton.svelte';
import { PUBLIC_TEST_ACCOUNT, PUBLIC_TEST_ACCOUNT_PW } from '$env/static/public';
export let form;
let email = PUBLIC_TEST_ACCOUNT;
//TODO: Before release delete value
let password = PUBLIC_TEST_ACCOUNT_PW;
//TODO: Before release delete value
let visible = false;
</script>
<div class="loginwrapper">
<form method="POST" action="/login">
<input id="email" name="email" type="text" placeholder="Enter your e-mail" value={form?.email ?? email}/>
<input id="password" name="password" type="password" placeholder="Enter your password" bind:value={password} />
<LoginButton />
{#if form?.missing}<p class="error">Please enter USERNAME</p>{/if}
{#if form?.incorrect}<p class="error">Please enter PASSWORD</p>{/if}
{#if form?.invalid}<p class="error">Invalid PASSWORD</p>{/if}
</form>
</div>
<style>
.loginwrapper {
width: 100dvw;
width: 100vw;
height: 100%;
display: flex;
justify-content: center;
margin-top: 30vh;
}
form {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
margin-top: 10px;
}
p {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
margin-top: 10px;
margin: 0.5%;
padding: 10px 15px;
width: max-content;
border: 1px solid #000000;
border-radius: 200px;
color: #000000;
margin-top: 10px;
}
.error {
margin-top: 5rem;
background-color: rgba(219, 69, 69, 0.821);
color: #ffffff;
transition: 2s all;
opacity: 0.5;
transition: opacity 10s;
box-shadow: 2px 2px 4px #00000041;
}
.error {
-webkit-animation: 4s 0s normal forwards 1 fadeout;
animation: 4s 0s normal forwards 1 fadeout;
}
@keyframes fadeout {
0% {
opacity: 1;
}
66% {
opacity: 0;
}
100% {
opacity: 0;
}
}
@-webkit-keyframes fadeout {
0% {
opacity: 1;
}
66% {
opacity: 0;
}
100% {
opacity: 0;
}
}
input {
margin: 0.7rem;
padding: 10px 15px;
background: #ffffff;
border: 0.1rem solid #000000;
border-radius: 200px;
color: #000000;
}
input:focus {
opacity: 1;
transition: 0.4s;
box-shadow: 2px 2px 4px #00000041;
}
button {
margin: 0.5%;
padding: 10px 15px;
background: #ffffff;
border: 0.1rem solid #000000;
border-radius: 200px;
color: #000000;
margin-top: 10px;
}
button:hover {
background: #94db93;
opacity: 1;
transition: 0.4s;
box-shadow: 2px 2px 4px #00000041;
}
button:focus {
background: #94db93;
opacity: 1;
transition: 0.4s;
box-shadow: 2px 2px 4px #00000041;
}
</style>
In diesem Beispiel wird das Formular mit den Eingabefeldern für E-Mail und Passwort dargestellt. Beim Absenden des Formulars wird überprüft, ob beide Felder ausgefüllt sind. Wenn nicht, wird eine Fehlermeldung angezeigt. Beachten Sie die Verwendung der {#if}-Schleife, um die Fehlermeldung nur dann anzuzeigen, wenn ein Fehler auftritt
import { error, fail, redirect } from '@sveltejs/kit';
export const actions = {
/**
* The default action for the login page.
*
* @async
* @param {Object} context - The context object.
* @param {Request} context.request - The request object.
* @param {Object} context.locals - The locals object.
* @throws {Error} If an error occurs during the action.
* @returns {Promise} A promise that resolves to a redirect or failure response.
*/
default: async ({ request, locals }) => {
const body = Object.fromEntries(await request.formData());
let email = body.email;
try {
await locals.pb.collection('users').authWithPassword(body.email, body.password);
} catch (err) {
if (!body.email) {
return fail(400, { email, missing: true });
}
if (!body.password) {
return fail(400, { email, incorrect: true });
}
if (!locals.pb?.authStore?.model?.verified) {
return fail(400, { email, invalid: true });
}
console.log('Error: ', err);
throw error(500, 'Something went wrong logging in');
}
throw redirect(303, `/profil/${locals.pb.authStore.model.name}`);
},
};